﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using System.IO;


using MM.Entities;
using MM.Business;

using System.Devices;// rapi2.dll

namespace MM
{
    public partial class frmTaoPhieuXK_MayQuet : Form
    {
        string _matau = "";
        string _nguoitao = "";
        string _sConn = "";
        string _plant = "";
        RemoteDevice rdev = null;
        List<TON_KHO> lstTonKho = new List<TON_KHO>();
        public List<VAT_TU_PHU_TUNG> lstVTPT = new List<VAT_TU_PHU_TUNG>();

        public frmTaoPhieuXK_MayQuet(string sConn)
        {
            InitializeComponent();
            _sConn = sConn;

            _matau = frmDangNhap.objTau._tenTau2KiTu.Trim();
            _nguoitao = frmDangNhap.objTaiKhoan._soCMND.Trim();


            this.gridControl1.DataSource = lstTonKho;
            this.txtNgayThucHien.Text = DateTime.Today.Day.ToString() + "/" + DateTime.Today.Month.ToString() + "/" + DateTime.Today.Year.ToString();
            this.txtNguoiThucHien.Text = _nguoitao;

            this.LoadThietBi();

            //this.txtFileName.Text = this.CatNoiDungFile(@"D:\Working\MM On Board\data for test\xuatkho.txt", "xuatkho.txt");

            //this.DocNoiDungFile(this.txtFileName.Text);
           
        }

        private void LoadThietBi()
        {
            if (this.cboMobileDevice.Items.Count >0)
                this.cboMobileDevice.Items.Clear();
            this.cmdNapDuLieu.Enabled = true;
           
            try
            {

                RemoteDeviceManager devmng = new RemoteDeviceManager();
                foreach (RemoteDevice dev in devmng.Devices)
                {
                    this.cboMobileDevice.Items.Add(dev.Name);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void cmdLuu_Click(object sender, EventArgs e)
        {
            try
            {
                PHIEU_XUAT_HANG oPXH = new PHIEU_XUAT_HANG();
                oPXH.NgayXuat = DateTime.Today;
                oPXH.NguoiXuat = _nguoitao;
                oPXH.PlantReferenceSAP = _plant;
                oPXH.MaTau = _matau;

                List<CHI_TIET_PXH> lstCTpxh = new List<CHI_TIET_PXH>();
                CHI_TIET_PXH oCT;
                for (int i = 0; i < lstTonKho.Count; i++)
                {
                    if (lstTonKho[i].SoLuong > 0 && lstTonKho[i].SoLuong <= lstTonKho[i].CuoiKy)
                    {
                        oCT = new CHI_TIET_PXH();
                        oCT.MaThietBi = lstTonKho[i].MaVTPT;
                        oCT.SoLuong = lstTonKho[i].SoLuong;
                        oCT.MaKho = lstTonKho[i].MaKho;
                        oCT.MaTrangThai = lstTonKho[i].MaTrangThai;


                        lstCTpxh.Add(oCT);
                    }
                }
                if (lstCTpxh.Count > 0)
                {
                    clsPHIEU_XUAT_HANG pxhCtrl = new clsPHIEU_XUAT_HANG(_sConn);
                    string maphieuxuathang = pxhCtrl.InsertPHIEU_XUAT_HANG(oPXH, lstCTpxh);
                    if (maphieuxuathang != "")
                    {
                        this.txtSoPhieuGI.Text = maphieuxuathang;
                        if (lstCTpxh.Count < lstTonKho.Count)
                        {
                            MessageBox.Show("TẠO PHIẾU THÀNH CÔNG!\n MỘT SỐ VTPT CÓ SỐ LƯỢNG XUẤT LỚN HƠN SỐ LƯỢNG TỒN");
                            lstTonKho.RemoveAll(delegate(TON_KHO x) { return x.SoLuong <= x.CuoiKy; });

                            // move file
                            string fpath = Path.GetDirectoryName(this.txtFileName.Text);
                            string fname = Path.GetFileName(this.txtFileName.Text);
                            File.Move(this.txtFileName.Text, fpath + "\\Loaded\\" + fname);
                        }
                        else
                            this.lstTonKho.Clear();
                    }
                    else
                    {
                        MessageBox.Show("LƯU DỮ LIỆU KHÔNG THÀNH CÔNG");

                    }
                    this.gridControl1.RefreshDataSource();
                }
                else
                    MessageBox.Show("KHÔNG TẠO ĐƯỢC PHIẾU XUẤT KHO.\n SỐ LƯỢNG XUẤT KHO PHẢI NHỎ HƠN HOẶC BẰNG SỐ LƯỢNG TỒN");
            }
            catch(Exception ex) 
            {
                MessageBox.Show("LỖI: " + ex.Message);
            }
        }

        

        private void frmTaoPhieuXK_Paint(object sender, PaintEventArgs e)
        {
           // Common.PaintGradientColor(Color.LightYellow, Color.LightSkyBlue, System.Drawing.Drawing2D.LinearGradientMode.Vertical, this.Width, this.Height, this);            
        }

        private void cmdBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog f = new OpenFileDialog();
            f.Filter = "Text file (*.txt*)|*.txt*";
            f.Title = "CHỌN FILE TEXT TỪ MÁY QUÉT KIỂM KHO ";
            if (f.ShowDialog() == DialogResult.OK)
            {
                lstTonKho.Clear();
                this.gridControl1.DataSource = lstTonKho;
                this.txtFileName.Text = f.FileName;
                this.DocNoiDungFile(f.FileName);                

                this.lblSoLuong.Text = "Tổng số dòng: "+lstTonKho.Count.ToString();
            }
        }

        private int DocNoiDungFile(string filename)
        {
            int kq = 0;
            try
            {                
                TON_KHO tkObj;

                Stream r = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                StreamReader reader = new StreamReader(r);

                clsVAT_TU_PHU_TUNG vtptCtrl = new clsVAT_TU_PHU_TUNG(_sConn);
                VAT_TU_PHU_TUNG oVTPT = new VAT_TU_PHU_TUNG();
                clsTRANG_THAI_VTPT ttvtCtrl = new clsTRANG_THAI_VTPT(_sConn);
                TRANG_THAI_VTPT oTTVT = new TRANG_THAI_VTPT();
                string giatri = "";

                clsTHAM_SO tsCtrl = new clsTHAM_SO(_sConn);
                THAM_SO tsObj = new THAM_SO();
                tsObj = tsCtrl.SelectTHAM_SO("vPXK_Template");
                if (tsObj != null && tsObj.DaXoa == 0)
                {
                    giatri = tsObj.GiaTri;
                }

                if (giatri == "")
                {
                    
                    MessageBox.Show("BẠN CHƯA NHẬP GIÁ TRỊ CHO THAM SỐ: vPXK_Template");
                    return -1;
                }

                int iMaKho = -1; // vị trí 
                int iMaVTPT = -1;
                int iSLQuet = -1;

                iMaKho = Array.IndexOf(giatri.Split(','), "MaKho");
                iMaVTPT = Array.IndexOf(giatri.Split(','), "MaVTPT");
                iSLQuet = Array.IndexOf(giatri.Split(','), "SLQuet");

                bool flag = true;
                while (!reader.EndOfStream)
                {
                    try
                    {
                       
                        tkObj = new TON_KHO();

                        string line = reader.ReadLine();
                        string[] arrvalue = new string[10];
                        arrvalue = line.Split('\t'); 


                        if (iMaKho > -1)
                        {
                            if (arrvalue[iMaKho] == _nguoitao)
                            {
                                flag = true;
                            }
                            else
                                flag = false;
                        }
                        else
                            flag = false;

                        if ((iMaKho > -1 && flag == true) || (iMaKho < 0 && flag == false))
                        {
                            #region Doc tung dong noi dung File
                            if (iMaVTPT > -1)
                            {
                                string[] arrBarCode = new string[4];
                                arrBarCode = arrvalue[iMaVTPT].Split('#');
                                if (arrBarCode[0] == "")// ma vtpt
                                {
                                    MessageBox.Show("MÃ VTPT BỊ TRỐNG");
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    return -1;
                                }
                                tkObj.MaVTPT = arrBarCode[0];

                                if (arrBarCode[1] == "")// ma KHO
                                {
                                    MessageBox.Show("MÃ KHO BỊ TRỐNG");
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    return -1;
                                }
                                tkObj.MaKho = arrBarCode[1];
                                if (arrBarCode[2] == "")// ma TRANG THAI
                                {
                                    MessageBox.Show("MÃ TRẠNG THÁI BỊ TRỐNG");
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    return -1;
                                }
                                try
                                {
                                    tkObj.MaTrangThai = int.Parse(arrBarCode[2]);
                                }
                                catch
                                {
                                    MessageBox.Show("MÃ TRẠNG THÁI SAI ĐỊNH DẠNG");
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    return -1;
                                }

                                oVTPT = new VAT_TU_PHU_TUNG();
                                oVTPT = vtptCtrl.SelectVAT_TU_PHU_TUNG(tkObj.MaVTPT.Trim(), frmDangNhap.objTau.maTau);
                                if (oVTPT != null && oVTPT._maVTPT != "")
                                {
                                    tkObj.TenVTPT = oVTPT._tenVTPT;
                                    chkKhonghople.Checked = false;
                                    this.cmdLuu.Enabled = true;
                                }
                                else
                                {
                                    tkObj.TenVTPT = "#KHÔNG TỒN TẠI DỮ LIỆU CHO VPTP NÀY";
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    MessageBox.Show("KHÔNG TỒN TẠI VTPT: " + tkObj.MaVTPT);
                                    return -1;
                                }
                                oTTVT = new TRANG_THAI_VTPT();
                                oTTVT = ttvtCtrl.usp_SelectTRANG_THAI_VTPTByMaTrangThai(tkObj.MaTrangThai);
                                if (oTTVT != null)
                                {
                                    tkObj.TenTrangThai = oTTVT.TenTrangThai;
                                    chkKhonghople.Checked = false;
                                    this.cmdLuu.Enabled = true;
                                }
                                else
                                {
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    return -1;
                                }
                            }
                            else
                            {
                                chkKhonghople.Checked = true;
                                this.cmdLuu.Enabled = false;
                                return -1;
                            }

                            if (iSLQuet > -1)
                            {
                                tkObj.SoLuong = float.Parse(arrvalue[iSLQuet].ToString());// so luong xuat                        
                                tkObj.MaGiaoTacKho = "XUATKHO";
                            }
                            else
                            {
                                chkKhonghople.Checked = true;
                                this.cmdLuu.Enabled = false;
                                return -1;
                            }

                            // kiem tra luong ton kho
                            clsCHI_TIET_KHO ctKhoCtrl = new clsCHI_TIET_KHO(_sConn);
                            CHI_TIET_KHO ctKhoObj = new CHI_TIET_KHO();
                            List<CHI_TIET_KHO> lstCTKho = new List<CHI_TIET_KHO>();
                            ctKhoObj.MaThietBi = tkObj.MaVTPT;
                            ctKhoObj.MaKho = tkObj.MaKho;
                            ctKhoObj.MaTrangThai = tkObj.MaTrangThai;

                            lstCTKho = ctKhoCtrl.usp_SelectCHI_TIET_KHO(ctKhoObj);
                            if (lstCTKho.Count == 1)
                            {
                                tkObj.CuoiKy = float.Parse(lstCTKho[0].SoLuongTon.ToString());
                                // kiem tra xem VTPT nay co cac phieu xuat kho nao chua duoc duyet
                                List<CHI_TIET_PXH> lstctpxh = new List<CHI_TIET_PXH>();
                                clsCHI_TIET_PXH ctpxhCtrl = new clsCHI_TIET_PXH(_sConn);
                                lstctpxh = ctpxhCtrl.usp_CheckSoLuongXuatKhoChuaDuyet(tkObj.MaVTPT, tkObj.MaKho, tkObj.MaTrangThai);
                                for (int i = 0; i < lstctpxh.Count; i++)
                                {
                                    tkObj.CuoiKy -= lstctpxh[i].SoLuong;
                                }
                            }
                            else
                            {
                                if (lstCTKho.Count > 1)
                                {
                                    chkKhonghople.Checked = true;
                                    this.cmdLuu.Enabled = false;
                                    MessageBox.Show("DỮ LIỆU TỒN KHO (TABLE CHI_TIET_KHO) BỊ TRÙNG DỮ LIỆU");
                                    return -1;
                                }
                            }

                            // kiem tra da ton tai trong danh sach thi tang so luong
                            int k = lstTonKho.FindIndex(delegate(TON_KHO x) { return x.MaVTPT == tkObj.MaVTPT && x.MaTrangThai == tkObj.MaTrangThai && x.MaKho == tkObj.MaKho; });
                            if (k < 0)
                            {
                                lstTonKho.Add(tkObj);
                            }
                            else
                                lstTonKho[k].SoLuong += tkObj.SoLuong;

                            #endregion Doc tung dong noi dung file
                        }
                        else
                        {
                            kq = -1;
                            MessageBox.Show("HỆ THỐNG CHỈ NẠP FILE ĐƯỢC TẠO BỞI USER ĐĂNG NHẬP");
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        kq = -1;
                        MessageBox.Show("KHÔNG THỂ NẠP ĐƯỢC DỮ LIỆU TỪ FILE.\nĐỊNH DẠNG FILE CHƯA ĐÚNG");
                        break;
                    }
                }// end while
                if (kq == 0)
                    kq = 1;
                this.gridControl1.RefreshDataSource();
                r.Close();
                r.Dispose();
                reader.Close();
                reader.Dispose();
            }
            catch (Exception ex)
            {
                kq = -1;
                MessageBox.Show(ex.Message);
            }
            return kq;
        }

        private void gridDSVT_RowStyle(object sender, RowStyleEventArgs e)
        {
            GridView View = sender as GridView;
            if (e.RowHandle >= 0)
            {                
                float soluong = float.Parse(View.GetRowCellDisplayText(e.RowHandle, "SoLuong"));
                float soluongton = float.Parse(View.GetRowCellDisplayText(e.RowHandle, "CuoiKy"));
                if (soluong> soluongton || soluong==0 )
                {
                    e.Appearance.BackColor = Color.Salmon;
                    e.Appearance.BackColor2 = Color.SeaShell;
                }
            }

        }

        private void frmTaoPhieuXK_MayQuet_Load(object sender, EventArgs e)
        {
            Common.SetColor(this);
        }

        private void cboMobileDevice_SelectedIndexChanged(object sender, EventArgs e)
        {
            // nap ten file
            try
            {
                this.cboFileName.Items.Clear();
                RemoteDeviceManager devmng = new RemoteDeviceManager();

                foreach (RemoteDevice dev in devmng.Devices)
                {
                    if (dev.Name == this.cboMobileDevice.Text.Trim())
                    {
                        rdev = dev;
                    }
                }
                if (rdev != null)
                {
                    // string myDocs = rdev.GetFolderPath(SpecialFolder.MyDocuments) + @"\KiemKho";
                    //string myDocs = @"\Temp\KiemKho";

                    string myDocs = "";

                    clsTHAM_SO tsCtrl = new clsTHAM_SO(_sConn);
                    THAM_SO tsObj = new THAM_SO();
                    tsObj = tsCtrl.SelectTHAM_SO("vPXK_Src"); // duong dan file se copy tu may kiem kho
                    if (tsObj != null && tsObj.DaXoa == 0)
                    {
                        myDocs = tsObj.GiaTri;
                    }

                    if (myDocs == "")
                    {
                        MessageBox.Show("VUI LÒNG NHẬP GIÁ TRỊ ĐƯỜNG DẪN LƯU FILE XUẤT FILE CỦA THIẾT BỊ TẠI THAM SỐ: vPXK_Src");
                        return;
                    }

                    string[] lstfile = RemoteDirectory.GetFiles(rdev, myDocs, "*.txt");
                    for (int i = 0; i < lstfile.Length; i++)
                    {
                        this.cboFileName.Items.Add(lstfile[i].ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void cmdNapDuLieu_Click(object sender, EventArgs e)
        {
            try
            {
                string filenameD = "";
                string filenameS = "";
                string filenameL = ""; // duong dan luu file da duoc doc noi dung
                clsTHAM_SO tsCtrl = new clsTHAM_SO(_sConn);
                THAM_SO tsObj = new THAM_SO();
                tsObj = tsCtrl.SelectTHAM_SO("vPXK_Des"); // duong dan luu file tren PC 

                if (tsObj != null && tsObj.DaXoa == 0)
                {
                    filenameD = tsObj.GiaTri;
                }

                tsObj = tsCtrl.SelectTHAM_SO("vPXK_Src"); // duong dan file se copy tu may kiem kho
                if (tsObj != null && tsObj.DaXoa == 0)
                {
                    filenameS = tsObj.GiaTri;
                }

                tsObj = tsCtrl.SelectTHAM_SO("vPXK_Des_Loaded"); // duong dan file se move tu Des vao Loaded
                if (tsObj != null && tsObj.DaXoa == 0)
                {
                    filenameL = tsObj.GiaTri;
                }

                if (filenameD != "" && filenameS != "" && filenameL!="")
                {


                    filenameD = filenameD + DateTime.Today.Year.ToString()+DateTime.Today.Month.ToString()+DateTime.Today.Day.ToString()+ "_" + this.cboFileName.Text;

                    filenameS += this.cboFileName.Text;

                    
                    RemoteFile.CopyFileFromDevice(rdev, filenameS , filenameD, true);

                    //rdev.Dispose();

                    if (File.Exists(filenameD))
                    {
                        
                        this.txtFileName.Text = this.CatNoiDungFile(filenameD, this.cboFileName.Text); // doc noi dung file và tách thành nhìu file tương ứng với MaKho - tức số cmnd của user 
                        if (this.txtFileName.Text != "") // cat thanh cong
                        {
                            lstTonKho.Clear();
                            this.gridControl1.DataSource = lstTonKho;
                            this.DocNoiDungFile(this.txtFileName.Text);

                            try
                            {
                                filenameL += DateTime.Today.Year.ToString() + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + "_" + this.cboFileName.Text;
                                File.Move(filenameD, filenameL);
                            }
                            catch { }

                            RemoteFile.Delete(rdev, filenameS);
                        }

                        this.lblSoLuong.Text = "Tổng số dòng: "+lstTonKho.Count.ToString();
                    }
                }
                else
                    MessageBox.Show("VUI LÒNG NHẬP GIÁ TRỊ THÔNG SỐ ĐƯỜNG DẪN: vPXK_Des,vPXK_Src,vPXK_Des_Loaded");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void DeleteFileAtMBDevice(string filenameS)
        {
            RemoteDeviceManager devmng = new RemoteDeviceManager();

            foreach (RemoteDevice dev in devmng.Devices)
            {
                if (dev.Name == this.cboMobileDevice.Text.Trim())
                {
                    rdev = dev;
                }
            }
            RemoteFile.Delete(rdev, filenameS);
            rdev.Dispose();
        }

        private string CatNoiDungFile(string filepath, string filename)
        {
            try
            {
                Stream r = File.Open(filepath , FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                StreamReader reader = new StreamReader(r);

              
                clsTHAM_SO tsCtrl = new clsTHAM_SO(_sConn);
                THAM_SO tsObj = new THAM_SO();
                string giatri = "";
                string path="";
                string returnFile = "";
                tsObj = tsCtrl.SelectTHAM_SO("vPXK_Template");
                if (tsObj != null && tsObj.DaXoa == 0)
                {
                    giatri = tsObj.GiaTri;
                }
                tsObj=new THAM_SO();
                tsObj = tsCtrl.SelectTHAM_SO("vPXK_Des");
                if (tsObj != null && tsObj.DaXoa == 0)
                {
                    path = tsObj.GiaTri;
                }

                int iMaKho = -1; // vị trí 

                iMaKho = Array.IndexOf(giatri.Split(','), "MaKho");

                if (iMaKho > -1 && path != "") // neu template co su dung scan so cmnd
                {

                    Dictionary<string, StreamWriter> dic = new Dictionary<string, StreamWriter>();
                    string socmnd = "";
                    StreamWriter w;
                    while (!reader.EndOfStream)
                    {

                        string line = reader.ReadLine();
                        string[] arrvalue = new string[10];
                        arrvalue = line.Split('\t');

                        socmnd = arrvalue[iMaKho].ToString();
                        if (socmnd != "")
                        {
                            if (dic.ContainsKey(socmnd))
                            {
                                dic[socmnd].WriteLine(line);
                            }
                            else
                            {
                                if (File.Exists(path + socmnd + "_" + filename))
                                    w = new StreamWriter(path + socmnd + "_" + filename, false);
                                else
                                    w = new StreamWriter(path + socmnd + "_" + filename, true);

                                w.WriteLine(line);
                                dic.Add(socmnd, w);
                            }
                        }
                    }

                    if (dic.Count > 0)
                    {
                        foreach (StreamWriter i in dic.Values)
                        {
                            i.Close();
                        }

                        if (dic.ContainsKey(frmDangNhap.objTaiKhoan._soCMND.Trim()))
                        {
                            returnFile = path + _nguoitao + "_" + filename;
                        }
                    }

                }
                else
                {

                }
                r.Close();
                r.Dispose();
                reader.Close();
                reader.Dispose();

                return returnFile;
            }
            catch(Exception ex) 
            {
                return "";
            }

        }

    }
}